///////////////////////////////////////////////////
/// tototoy Code
/// $Id: hashtable.h 37 2009-10-21 13:39:27Z tonyjobmails $
/// $Date: 2009-10-21 13:39:27 +0000 (Wed, 21 Oct 2009) $
/// $Author: tonyjobmails $
/// $Revision: 37 $
/// E-mail: tonyjobmails@gmail.com
/// filename: hashtable.h
/// function: 一些hash表的实现
///////////////////////////////////////////////////

#ifndef __HASHTABLE__H
#define __HASHTABLE__H

#include <hash_map>
#include "base.h"

namespace tototoy
{
	//////////////////////////////////////////////////
	//////////////////////////////////////////////////
	/// hash比较的函数对象
	template<typename _T>
	struct hash_compare : public std::binary_function<_T, _T, bool>
	{
		inline bool operator()(const _T e1, const _T e2) const;
	};

	/// 模板参数_T特化为char*
	template<>
	inline bool hash_compare<const char*>::operator()(const char* e1, const char* e2) const
	{
		return (strncmp(e1, e2, (sizeof(e1) > sizeof(e2)) ? sizeof(e1) : sizeof(e2)) == 0);
	};

	/// 模板参数_T特化为_uint_32
	template<>
	inline bool hash_compare<base_type::_uint_32>::operator()(const base_type::_uint_32 e1, const base_type::_uint_32 e2) const
	{
		return (e1 == e2);
	};
	
	//////////////////////////////////////////////////
	//////////////////////////////////////////////////

	//////////////////////////////////////////////////
	//////////////////////////////////////////////////
	/// hash表实现(目前实现了char*和_uint_32的版本)
	/////////////////////////////////
	/// hash表类定义
	template<typename _key, typename _value>
	class hashmap
	{
		protected:
			typedef __gnu_cxx::hash_map<_key, _value, __gnu_cxx::hash<_key>, hash_compare<_key> > _hash_map;
			typedef typename _hash_map::iterator _hash_map_iter;
			_hash_map hash;		/// 散列表结构

		public:
			hashmap() {};
			~hashmap() {};

			inline base_type::_uint_32 size();                                 /// 散列表大小
			inline bool empty();                                    /// 判断是否为空
			inline void clear();                                    /// 消毁
			inline bool insert(const _key &key, _value value);      /// 插入
			inline bool find(const _key &key, _value &value);       /// 查找
			inline bool remove(const _key &key);                    /// 移除
	};
	/////////////////////////////////

	/////////////////////////////////
	/// @brief 插入
	/// @param key：索引
	/// @param value：值
	/// @return 成功与否
	template<typename _key, typename _value>
	inline bool hashmap<_key, _value>::insert(const _key &key, _value value)
	{
		this->hash[key] = value;
		return true;
	}
	/////////////////////////////////

	/////////////////////////////////
	/// @brief 查找
	/// @param key：索引
	/// @param value：查找到的值
	/// @return 成功与否
	template<typename _key, typename _value>
	inline bool hashmap<_key, _value>::find(const _key &key, _value &value)
	{
		_hash_map_iter iter = this->hash.find(key);
		if(iter != this->hash.end())
		{
			value = iter->second;
			return true;
		}
		return false;
	}
	/////////////////////////////////

	/////////////////////////////////
	/// @brief 移除
	/// @param key：要移除的键值
	/// @return：成功与否
	template<typename _key, typename _value>
	inline bool hashmap<_key, _value>::remove(const _key &key)
	{
		this->hash.erase(key);
		return true;
	}
	/////////////////////////////////

	/////////////////////////////////
	/// @brief散列表大小
	/// @return 成功与否
	template<typename _key, typename _value>
	inline base_type::_uint_32 hashmap<_key, _value>::size()
	{
		return this->hash.size();
	}
	/////////////////////////////////

	/////////////////////////////////
	/// @brief 判断是否为空
	/// @return 成功与否
	template<typename _key, typename _value>
	inline bool hashmap<_key, _value>::empty()
	{
		return this->hash.empty();
	}
	/////////////////////////////////

	/////////////////////////////////
	/// @brief 消毁
	template<typename _key, typename _value>
	inline void hashmap<_key, _value>::clear()
	{
		this->hash.clear();
	}
	/////////////////////////////////
	//////////////////////////////////////////////////
	//////////////////////////////////////////////////
};

#endif
